home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / src / udphdr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-10  |  1.6 KB  |  73 lines

  1. /* @(#) $Header: udphdr.c,v 1.3 91/05/09 07:39:12 deyke Exp $ */
  2.  
  3. /* UDP header conversion routines
  4.  * Copyright 1991 Phil Karn, KA9Q
  5.  */
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "ip.h"
  9. #include "internet.h"
  10. #include "udp.h"
  11.  
  12. /* Convert UDP header in internal format to an mbuf in external format */
  13. struct mbuf *
  14. htonudp(udp,data,ph)
  15. struct udp *udp;
  16. struct mbuf *data;
  17. struct pseudo_header *ph;
  18. {
  19.     struct mbuf *bp;
  20.     register char *cp;
  21.     int16 checksum;
  22.  
  23.     /* Allocate UDP protocol header and fill it in */
  24.     if((bp = pushdown(data,UDPHDR)) == NULLBUF)
  25.         return NULLBUF;
  26.  
  27.     cp = bp->data;
  28.     cp = put16(cp,udp->source);     /* Source port */
  29.     cp = put16(cp,udp->dest);       /* Destination port */
  30.     cp = put16(cp,udp->length);     /* Length */
  31.     *cp++ = 0;                      /* Clear checksum */
  32.     *cp-- = 0;
  33.  
  34.     /* All zeros and all ones is equivalent in one's complement arithmetic;
  35.      * the spec requires us to change zeros into ones to distinguish an
  36.      * all-zero checksum from no checksum at all
  37.      */
  38.     if((checksum = cksum(ph,bp,ph->length)) == 0)
  39.         checksum = 0xffffffff;
  40.     put16(cp,checksum);
  41.     return bp;
  42. }
  43. /* Convert UDP header in mbuf to internal structure */
  44. int
  45. ntohudp(udp,bpp)
  46. struct udp *udp;
  47. struct mbuf **bpp;
  48. {
  49.     char udpbuf[UDPHDR];
  50.  
  51.     if(pullup(bpp,udpbuf,UDPHDR) != UDPHDR)
  52.         return -1;
  53.     udp->source = get16(&udpbuf[0]);
  54.     udp->dest = get16(&udpbuf[2]);
  55.     udp->length = get16(&udpbuf[4]);
  56.     udp->checksum = get16(&udpbuf[6]);
  57.     return 0;
  58. }
  59. /* Extract UDP checksum value from a network-format header without
  60.  * disturbing the header
  61.  */
  62. int16
  63. udpcksum(bp)
  64. struct mbuf *bp;
  65. {
  66.     struct mbuf *dup;
  67.  
  68.     if(dup_p(&dup,bp,6,2) != 2)
  69.         return 0;
  70.     return pull16(&dup);
  71. }
  72.  
  73.